package com.upbos.upm.role;

import com.upbos.upm.entity.Module;
import com.upbos.upm.entity.Role;
import com.upbos.upm.module.ModuleDao;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * <b>Application name：</b> RoleService.java <br>
 * <b>Application describing: 角色管理服务类</b> <br>
 * <b>Copyright：</b> Copyright &copy; 2015-2020 yideb.com 版权所有<br>
 * <b>Company：</b> yideb.com <br>
 * <b>Date：</b> 2019年08月17日 17:09 <br>
 * <b>@author：</b> <a href="mailto:wangjz@miyzh.com"> Jason </a>
 * <b>version：</b> V5.0.0
 */
@Service
public class RoleService {

    @Resource
    private RoleDao roleDao;

    @Resource
    private ModuleDao moduleDao;

    /**
     * 获取全部角色列表
     *
     * @return
     */
    public List<Role> listRole(String orgId, String name) {
        return roleDao.listRole(orgId, name);
    }

    /**
     * 保存角色
     *
     * @param role 角色
     */
    @Transactional(rollbackFor = Exception.class)
    public void saveRole(Role role) {
        if (role.getId() == null) {
            roleDao.insertRole(role);
        } else {
            roleDao.updateRole(role);
        }
    }

    /**
     * 删除角色
     *
     * @param roleId 角色Id
     */
    @Transactional(rollbackFor = Exception.class)
    public void deleteRole(Integer roleId) {
        roleDao.deleteRole(roleId);
    }

    /**
     * 保存角色对应的功能模块列表
     *
     * @param roleId    角色Id
     * @param moduleIds 功能模块Id列表
     */
    @Transactional(rollbackFor = Exception.class)
    public void updateRoleModule(Integer roleId, String[] moduleIds) {
        // 所有模块模块列表
        List<Module> allModule = moduleDao.listAllModule();
        // 仅保存功能模块（叶子节点）
        List<String> insertModuleIds = new ArrayList<>();
        // 传进来的功能模块列表里面含有目录，应过滤掉目录
        for (String moduleId : moduleIds) {
            for (Module module : allModule) {
                if (module.getIsLeaf() && moduleId.equals(module.getId())) {
                    insertModuleIds.add(moduleId);
                    break;
                }
            }
        }

        roleDao.updateRoleModule(roleId, insertModuleIds);
    }

    /**
     * 根据角色id获取角色对应的功能模块Id列表
     *
     * @param roleId 角色Id
     * @return 功能模块列表
     */
    public String[] listRoleModule(Integer roleId) {
        List<String> list = roleDao.listRoleModule(roleId);
        String[] arr = new String[list.size()];
        for (int i = 0; i < list.size(); i++) {
            arr[i] = list.get(i);
        }
        return arr;
    }

    /**
     * 根据功能模块名称获取角色列表
     *
     * @param name 功能模块名称
     * @return 角色列表
     */
    public List<Role> listRoleByName(String name) {
        return roleDao.listRoleByName(name);
    }
}
